package java_1_24.stack_queue.stack;

import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;

/**
 * 基于数组的顺序栈实现
 * @param <E>
 */
public class MyStack<E> {
    //当前栈的数据个数
    private int size;
    //实际存储数据的动态数组-ArrayList-长度不够自动扩容
    private List<E> data=new ArrayList<>();
    /**
     * 将val入栈
     * @param val
     */
    public void push(E val){
        //默认List集合的add是尾插
        data.add(val);
        size++;
    }

    /**
     * 弹出栈顶元素,返回栈顶的值
     * @return
     */
    public E pop(){
        if(isEmpty()){
            //栈为空，没有栈顶元素,抛出异常
            throw new NoSuchElementException("stack is empty!cannot pop!");
        }
        //删除栈顶元素
        E val=data.remove(size-1);
        size--;
        return val;
        //这三行可写成一句：return data.remove(--size);
    }

    /**
     * 返回栈顶元素，但不出栈
     * @return
     */
    public E peek(){
        if(isEmpty()){
            throw new NoSuchElementException("stack is empty!cannot peek!");
        }
        return data.get(size-1);
    }

    /**
     * 返回当前栈顶元素是否为空
     * @return
     */
    public boolean isEmpty(){
        return size==0;
    }

    /**
     * 打印栈的元素
     * @return
     */
    @Override
    public String toString() {
     StringBuilder sb=new StringBuilder();
     sb.append("[");
        for (int i = 0; i < size; i++) {
            sb.append(data.get(i));
            if(i!=size-1){
                sb.append(",");
            }
        }
        sb.append("] top");
     return sb.toString();
    }
}
